home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prcart.c < prev    next >
C/C++ Source or Header  |  1995-04-06  |  5KB  |  227 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #include "prtrans.h"
  5.  
  6. #if !defined(__MAIN_C__)
  7. #define main    main_prcart
  8. #endif
  9.  
  10. unsigned char auxcode[] = {
  11.   0x78, 0xa9, 0x41, 0x8d, 0x04, 0xa0, 
  12.   0xa2, 0xff, 0x9a, 0xd8, 0xe8, 0x4c, 0, 0,
  13.   0xa2, 0x0d, 0x8d, 0x04, 0xa0, 0x20, 0x8d, 0xfd,
  14.   0x20, 0x52, 0xfd, 0x20, 0xf9, 0xfd,
  15.   0x20, 0, 0, 0x4c, 0x38, 0xfd
  16. };
  17.  
  18. unsigned char *auxstart = &auxcode[12];
  19. unsigned char *srvstart = &auxcode[29];
  20.  
  21. #define AUXJUMP (auxaddr + 14)
  22.  
  23. #if defined(__MAIN_C__)
  24. unsigned char buffer[8192]; /* input buffer */
  25. #else
  26. extern unsigned char buffer[];
  27. #endif
  28.  
  29. int main (int argc, char **argv);
  30.  
  31. int main (int argc, char **argv) {
  32.   unsigned auxaddr = 20000, driveraddr, basicaddr;
  33.   FILE *file = stdin;
  34.   unsigned start = 0xa000, jumpaddress = 0,
  35.            flag = 0, length;
  36.   unsigned i;
  37.   char **parameters = argv;
  38.   baseaddr = portaddr[DEFAULT_PORT];
  39.  
  40.   while (*++parameters && **parameters == '-') { /* check for options */
  41.     if (parameters[0][1] == '-') { /* "--" ends options */
  42.       parameters++;
  43.       break;
  44.     }
  45.  
  46.     switch (parameters[0][1]) {
  47.     case 'p':
  48.       baseaddr = strtoul (*++parameters, NULL, 16);
  49.  
  50.       if (baseaddr > 3) {
  51.         fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
  52.                          *argv);
  53.         return 1;
  54.       }
  55.  
  56.       baseaddr = portaddr[baseaddr];
  57.  
  58.       break;
  59.  
  60.     case 'a':
  61.       if (*++parameters)
  62.         if (65536 > (auxaddr = strtoul (*parameters, NULL, 10)))
  63.           break;
  64.  
  65.       goto Usage;
  66.  
  67.     case 'j':
  68.       if (*++parameters) {
  69.     flag = 1;
  70.  
  71.         jumpaddress = strtoul (*parameters, NULL, 16);
  72.  
  73.         if (jumpaddress < 65536)
  74.           break;
  75.       }
  76.       /* bleed through */
  77.  
  78.     case '?':
  79.     case 'h':
  80.     Usage:
  81.       fprintf (stderr, "%s: Uploads a cartridge to the VIC-20.\n\n", *argv);
  82.       fprintf (stderr, "Usage: %s [options] [filename.a000 [filename.6000]]\n",
  83.                        *argv);
  84.       fprintf (stderr, "Options:\n\t"
  85.                          "-j addr\t"
  86.                  "Jumps to the specified address after the transfers.\n\t\t"
  87.                              "Not useful with auto-start cartridges.\n\t"
  88.              "-a addr\t"
  89.                  "Specifies the restart address of the game.  Default=20000.\n\t\t"
  90.                  "Only useful with auto-start cartridges.\n\t"
  91.                          "-p port\t"
  92.                              "Specify the printer port number (0 to 3).\n");
  93.       return 1;
  94.  
  95.     default:
  96.       fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
  97.       goto Usage;
  98.     }
  99.   }
  100.  
  101.   if (prinit ()) {
  102.     fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
  103.     return 4;
  104.   }
  105.  
  106.   output (REQ_INFO); /* request machine type info */
  107.  
  108.   if (20 != wait_input ()) {
  109.     fprintf (stderr, "%s: The client is not a VIC-20.\n", *argv);
  110.     input (); input (); input (); input (); /* read the rest of the info */
  111.     return 5;
  112.   }
  113.  
  114.   driveraddr = input();
  115.   driveraddr |= input() << 8;
  116.   basicaddr = input();
  117.   basicaddr |= input() << 8;
  118.  
  119.   fprintf (stderr, "%s: Driver address %04X, BASIC start address %04X.\n",
  120.                *argv, driveraddr, basicaddr);
  121.  
  122.   if (*parameters) file = NULL;
  123.  
  124.   while (*parameters || (file == stdin && !feof (file))) {
  125.     if (file != stdin && !(file = fopen(*parameters, "rb"))) {
  126.       fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
  127.                        *parameters);
  128.       return 5;
  129.     }
  130.  
  131.     length = fread (buffer, 1, 8192, file);
  132.  
  133.     if (length != 8192 && length != 4096) {
  134.       fprintf (stderr, "%s: Short file.\n", *argv);
  135.  
  136.       fclose (file);
  137.  
  138.       return 5;
  139.     }
  140.  
  141.     if (start == 0xa000 && !flag &&
  142.         !memcmp (&buffer[4], "A0\xC3\xC2\xCD", 5)) {
  143.       /* a0CBM autostart code found and no other jumpaddress specified */
  144.       flag = 2;
  145.  
  146.       auxstart[0] = buffer[0];
  147.       auxstart[1] = buffer[1];
  148.       buffer[0] = (unsigned char)AUXJUMP;
  149.       buffer[1] = AUXJUMP >> 8;
  150.     }
  151.  
  152.     output (REQ_LOAD); /* op code for upload */
  153.     output (0); /* specify the bank address */
  154.  
  155.     if (input ()) {
  156.     notReady:
  157.       fprintf (stderr, "%s: not ready to transfer\n", *argv);
  158.       fclose (file);
  159.       return 6;
  160.     }
  161.     else
  162.       fprintf (stderr, "%s: ok to transfer\n", *argv);
  163.  
  164.     output (start);
  165.     output (start >> 8);
  166.     output (start + length);
  167.     output ((start + length) >> 8);
  168.  
  169.     send (buffer, length);
  170.  
  171.     if (file == stdin) {
  172.       i = getc (file);
  173.  
  174.       if (feof (file))
  175.         break;
  176.  
  177.       ungetc (i, file);
  178.     }
  179.     else {
  180.       fclose (file);
  181.       parameters++;
  182.     }
  183.  
  184.     if (start == 0xa000)
  185.       start = 0x6000;
  186.     else
  187.       break;
  188.   }
  189.  
  190.   if (flag) { /* start the cartridge */
  191.     if (flag == 2) {
  192.       output (REQ_LOAD); /* first send the startup code */
  193.       output (0);
  194.  
  195.       if (input ())
  196.         goto notReady;
  197.  
  198.       fprintf (stderr, "%s: ok to transfer\n", *argv);
  199.  
  200.       output (auxaddr);
  201.       output (auxaddr >> 8);
  202.       output (auxaddr + sizeof auxcode);
  203.       output ((auxaddr + sizeof auxcode) >> 8);
  204.  
  205.       srvstart[0] = (unsigned char)driveraddr;
  206.       srvstart[1] = driveraddr >> 8;
  207.  
  208.       for (i = 0; i < sizeof auxcode; i++)
  209.         output (auxcode[i]);
  210.  
  211.       jumpaddress = auxaddr;
  212.  
  213.       fprintf (stderr, "%s: Type SYS%u to restart the game after reset.\n",
  214.                        *argv, auxaddr);
  215.     }
  216.  
  217.     output (REQ_JUMP);
  218.     output (0);
  219.     output (jumpaddress);
  220.     output (jumpaddress >> 8);
  221.   }
  222.  
  223.   prclose ();
  224.  
  225.   return 0;
  226. }
  227.